Q:什么是闭包?
- 引用了自由变量的函数。
- 这个被引用的自由变量将和这个函数一同存在,即使是已经离开了创造它的环境也不例外。
- 闭包是由函数和与其相关的引用环境组合而成的实体
Q:闭包的两个要素?
- 返回一个内部函数
- 被这个函数引用的外部变量
Q:举个例子?
1 | def count(): |
1 | def count(): |
1 | def count(): |
1 | def makeadder(addend): |
闭包的应用–装饰器
装饰器Decorator:以函数为参数返回一个可调用对象(含有__call__方法),实现其额外功能更新
应用场景:
- 对原函数功能的补充:测量时间,输出日志等
- 对原函数功能的调整:利用原函数运行结果,再次运算产生新结果
- 对原函数功能的重写,只是借用原来的名字。
- web路由
- 身份认证
每个装饰器函数需要返回一个函数引用,因此要在函数内部再定义一个函数,一般都用wrapper这个名字
在装饰器函数内部进行功能扩展
语法糖Syntactic Sugar:方便使用但无实质功能的语法
采用@作为语法糖,辅助装饰器使用
任何语法糖表达的装饰器都对应一个函数
classmethod()内置函数和@classmethod
staticmethod()和@staticmethod
1 | def f(...): |
1 |
|
1 | def bar( foo ): |
1 | def add100(f): |
1 | def addn(n): # 接收 装饰器 参数 |
1 | def makebold(fn): |
1 | class function_wrapper(object): |
1 | from decorator import decorator |
1 | import functools |